/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import exception.DuplicateConstraintException;
import exception.RemoveConstraintException;
import java.util.List;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.validation.ConstraintViolationException;
import model.entidades.Unidade;

/**
 *
 * @author helton
 */
public class UnidadeDao {
    @PersistenceContext
    private EntityManager em;

    public void insert(Unidade unidade) throws DuplicateConstraintException {
        try {
            em.persist(unidade);
            em.flush();
        } catch (Exception e) {
            if (e.getCause() instanceof ConstraintViolationException) {
                throw new DuplicateConstraintException("Nome Unidade", unidade.getNomUnid());
            }
        }
    }

    public Unidade update(Unidade unidade) throws DuplicateConstraintException {
        try {
            unidade = em.merge(unidade);
            em.flush();
        } catch (Exception e) {
            if (e.getCause() instanceof ConstraintViolationException) {
                throw new DuplicateConstraintException("Nome Unidade", unidade.getNomUnid());
            }
        }
        return unidade;
    }

    public void delete(Unidade unidade) throws RemoveConstraintException {
        try {
            unidade = em.merge(unidade);
            em.remove(unidade);
            em.flush();
        } catch (Exception e) {
            if (e.getCause() instanceof ConstraintViolationException) {
                throw new RemoveConstraintException();
            }
        }
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public Unidade findById(Object id) {
        return em.find(Unidade.class, id);
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Unidade> getAll() {/*CriteriaBuilder cb = em.getCriteriaBuilder();
         CriteriaQuery<Ficha> cq = cb.createQuery(Ficha.class);
         Root<Ficha> fichas = cq.from(Ficha.class);
         cq.select(fichas);
         return em.createQuery(cq).getResultList();*/
        Query q = em.createQuery("SELECT unidade from Unidade as unidade ORDER BY unidade.nomUnid");
        return q.getResultList();
    }
}
